home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / macros / latex209 / contrib / trees / pstrees / slurp.c < prev    next >
C/C++ Source or Header  |  1994-01-28  |  3KB  |  212 lines

  1. #include "align.h"
  2. /* VAX/VMS verion
  3. #include <unixio>
  4. */
  5. #include <stdio.h>
  6. #include <ctype.h>
  7.  
  8. char *input_pointer;
  9.  
  10. FILE *outstream;
  11.  
  12. static FILE *input_stream;
  13.  char  input_buffer[512];
  14. static int   input_eof = TRUE;
  15. static int   input_eoln = TRUE;
  16. static int   line_count;
  17.  
  18.  
  19. int open_source(file)
  20. char *file;
  21. {
  22.   input_pointer = input_buffer;
  23.   line_count = 0;
  24.   if (strcmp(file,"stdin") == 0) {
  25.     input_eof = FALSE;
  26.     input_stream = stdin;
  27.     return(TRUE);
  28.   }
  29.   else
  30.   if ((input_stream = fopen(file,"r")) != NULL) {
  31.     input_eof = FALSE;
  32.     return(TRUE);
  33.   }
  34.   else {
  35.   input_eof = TRUE;
  36.   return(FALSE);
  37.   }
  38. }
  39.  
  40.  
  41. int fetchline()
  42. {
  43.   if (fgets(input_buffer,511,input_stream) == NULL) {
  44.     input_eof=TRUE;
  45.     return(FALSE);
  46.   }
  47.   else {
  48.     input_pointer = input_buffer;
  49.     line_count++;
  50.     input_eoln = FALSE;
  51.     return(TRUE);
  52.   }
  53. }
  54.  
  55.  
  56. /* returns the next character, interpreting EOLN as ' ', calling
  57.    for new line at EOLN, and maintaining input_eoln flag. */
  58. char nextchar()
  59. {
  60.   char c;
  61.  
  62.   if (input_eoln) {
  63.     if (fetchline())
  64.       input_eoln = FALSE;
  65.     else  return(' ');
  66.     }
  67.  
  68.   c = *input_pointer++;
  69.   if (c == '\n') {
  70.     input_eoln = TRUE;
  71.     return(' ');
  72.   }
  73.   else return(c);
  74.  
  75. }
  76.  
  77. /* returns nextchar without advancing char pointer */
  78. char peekchar()
  79. {
  80.   char c;
  81.   c = nextchar();
  82.   input_pointer--;
  83.   return(c);
  84. }
  85.  
  86. /* returns current position (old)
  87. int currentpos()
  88. {
  89.   return(input_pointer-input_buffer);
  90. }
  91. */
  92.  
  93. int currentpos()
  94. {
  95.   int pos;
  96.   char *point;
  97.  
  98.   pos = 0;
  99.   for (point = input_buffer; point <= input_pointer; point++)
  100.     if (*point == '\t') {
  101.       pos = pos - (pos%8)+8;
  102.     }
  103.     else pos++;
  104.   return(pos);
  105. }
  106.  
  107.  
  108. /* returns TRUE if remainder of line matches string */
  109. int matchstr(s)
  110. char s[];
  111. {
  112.   if (!strncmp(input_pointer,s,strlen(s)))
  113.     return(TRUE);
  114.   else
  115.    return(FALSE);
  116. }
  117.  
  118. /* returns whether end-of-line has been reached */
  119. int eoln()
  120. {
  121.   return(input_eoln);
  122. }
  123.  
  124. /* returns whether end-of-file has been reached */
  125. int eof()
  126. {return(input_eof);}
  127.  
  128. /* advances to next printing char */
  129. void advance()
  130. {
  131.   while (nextchar() == ' ' && !eof()) {};
  132.   input_pointer--;
  133. }
  134.  
  135. /* advances to next printing char or eoln, returning TRUE if not eoln */
  136. int advanceeoln()
  137. {
  138.   char c;
  139.  
  140.   if (eoln()) return(FALSE);
  141.   while ((c = nextchar()) == ' ' || c == '\t')
  142.     if (eoln()) return(FALSE);
  143.   input_pointer--;
  144.   return (TRUE);
  145. }
  146.  
  147. /* returns actual next char, no fiddles */
  148. char squizchar()
  149. {
  150.       return(*input_pointer);
  151. }      
  152.  
  153.  
  154. int advanceeoln_pos(pos)
  155. int *pos;
  156. {
  157.   int okay;
  158.  
  159.   okay = advanceeoln();
  160.   *pos = currentpos();
  161.   return(okay);
  162. }
  163.  
  164. skip_to(to)
  165. char to[];
  166. {
  167.   int l;
  168.   l = strlen(to);
  169.   while (!(strncmp(to,input_pointer,l) == 0 || eof())) {
  170.     nextchar();
  171.   }
  172. }
  173.  
  174. gettoken(t)
  175. char *t;
  176. {
  177.   if (advanceeoln()) {
  178.     if (isalnum(*t++ = nextchar())) {
  179.       while (isalnum(*t++ = nextchar())) {}
  180.       input_pointer--;
  181.       t--;
  182.     }
  183.     *t = '\0';
  184.     return(TRUE);
  185.   }
  186.   else return(FALSE);
  187. }
  188.  
  189.  
  190. int linecount()
  191. {return(line_count);}
  192.  
  193. void writeline()
  194. {
  195.   fputs(input_buffer,outstream);
  196. }
  197.  
  198. /*
  199. main()
  200. {
  201.  
  202.   char s[30];
  203.  
  204.   open_source("stdin");
  205.   printf(": ");
  206.  
  207.   fetchline();
  208.   while (gettoken(s))
  209.     printf("%s\n",s);
  210. }
  211. */
  212.